#include "my_err_check.h"


static int low_3v3_cnt = 95;    // 防止低电刚开机时，刚开机还是显示绿灯
static int high_3v3_cnt = 195;
static int low_3v4_cnt = 0;
static int low_3v6_cnt = 0;

static int bat_notify_cnt = 0;
static int bat_power_off_cnt = 0;
static int print_delay;
/***********************************
 * 20ms 进入一次 

    1.告警电压阈值为3.65V，在开机状态下电池电压低于3.65开始进行低电提醒，不关机；
        工作状态即带载情况下，减去对应的压降，比如在所在工作模式下电池电压低于3.65-V0；
        V0为各个档位带载的均值，进行低电告警；
    2.当开机电压低于3.4V或者在工作模式下低于3.3V，停止输出后告警关机；
    3.再次开机如上述1和2，放电电池电量只降不升。
 */
static void bat_too_low_ckeck(void)
{
    int bat_notify_val;
    int bat_power_off_val;
    static int8_t last_sta =0xff;

    if(last_sta != get_sys_state()){
        printf(" cur_bat:|%d|mV, notify:[%d]mV, power_off[%d]mV\r\n", get_sys_battery_voltage(), IDLE_STA_BAT_LOW_VAL, BOOT_UP_MIN_BAT_VAL);
        last_sta = get_sys_state();
    }
    switch(get_sys_state()){
        case CHARGE_STA:
        case CHARGE_FINISH_STA:{
                low_3v3_cnt = 0;
                high_3v3_cnt = 0;
                low_3v4_cnt = 0;
                break;
            }
        case SLEEP_STA:{

                if(get_sys_battery_voltage() < BOOT_UP_MIN_BAT_VAL){
                    bat_power_off_cnt ++;
                    if(bat_power_off_cnt > 70){
                        bat_power_off_cnt = 0;
                        bat_notify_cnt = 0;
                        set_sys_err_mode(BAT_LOWEST);
        
                    }
                }
                else if(get_sys_battery_voltage() < IDLE_STA_BAT_LOW_VAL){
                    bat_notify_cnt ++;
                    if(bat_notify_cnt > 70){
                        bat_notify_cnt = 0;
                        set_sys_err_mode(BAT_LOW);
                    }
                }
                else{
                    clear_sys_err_mode(BAT_LOWEST);
                    clear_sys_err_mode(BAT_LOW);
                    bat_notify_cnt = 0;
                    bat_power_off_cnt = 0;
                }
                break;
            }
        case SYS_IDLE_STA:
        case ERR_STA:
        case NORMAL_WORK_STA:{
        // 工作阶段，电压状态只降不升 ---提示红色，低电关机
            if(sys_data.cur_mode_active_online_flag){   
                 switch(get_sys_mode()){
                    case MAX_MODE:
                    case TEST_ONLY_RF_MODE:{
                        bat_notify_val = WORK_RF_STA_BAT_LOW_VAL;
                        bat_power_off_val = WORK_RF_STA_BAT_POWER_OFF_VAL;
                        break;
                    }
                    default:{
                        bat_notify_val = WORK_NO_RF_STA_BAT_LOW_VAL;
                        bat_power_off_val = WORK_NO_RF_STA_BAT_POWER_OFF_VAL;
                        break;
                    }       
                }
            }
            else{
                bat_notify_val = IDLE_STA_BAT_LOW_VAL;
                bat_power_off_val = IDLE_STA_BAT_POWER_OFF_VAL;
            }

            if(get_sys_battery_voltage() < bat_power_off_val){
                bat_power_off_cnt ++;
                if(bat_power_off_cnt == 5){
                    bat_notify_cnt = 0;
                }
                if(bat_power_off_cnt > 100){
                    set_sys_err_mode(BAT_LOWEST);
                    set_sys_state(ERR_STA);
                    // printf("----enter lowest, bat:%d-----\r\n",get_sys_battery_voltage());
                }
                if(print_delay %20 == 0){
                    // printf("\r\n bat1111:[%d],bat_notify_cnt:[%d],bat_power_off_cnt:[%d] \r\n", get_sys_battery_voltage(), bat_notify_cnt, bat_power_off_cnt);
                }
            }   // -提示红色
            else if(get_sys_battery_voltage() < bat_notify_val){
                bat_notify_cnt ++;
                if(bat_notify_cnt == 10){
                    bat_power_off_cnt = 0;
                }

                if(bat_notify_cnt > 100){
                    bat_notify_cnt = 0;
                    if((get_sys_err_mode()&BAT_LOW) == 0){
                        set_sys_err_mode(BAT_LOW);
#ifdef DEBUG_OPEN_PRINT                         
                        printf("\r\n enter_BAT_LOW:[%d] \r\n", get_sys_battery_voltage());
#endif                        
                    }
                    // printf("\r\n get_sys_err_mode:[%d] \r\n", get_sys_err_mode());
                }
                if(print_delay %20 == 0){
                    // printf("\r\n bat2222:[%d],bat_notify_cnt:[%d],bat_power_off_cnt:[%d] \r\n", get_sys_battery_voltage(), bat_notify_cnt, bat_power_off_cnt);
                }
            }
            else{
                bat_notify_cnt = 0;
                bat_power_off_cnt = 0;
                // clear_sys_err_mode(BAT_LOWEST);      // 实际工作工程中电池电压只降不升，所以工作状态下一旦低电提示，则不再恢复
                // clear_sys_err_mode(BAT_LOW);
                if(print_delay %20 == 0){
                    // printf("\r\n bat3333:[%d],bat_notify_cnt:[%d],bat_power_off_cnt:[%d] \r\n", get_sys_battery_voltage(), bat_notify_cnt, bat_power_off_cnt);
                }
            }
            print_delay ++;
            // if(print_delay %100 == 0){
            //     printf("\r\n bat:[%d],bat_notify_cnt:[%d],bat_power_off_cnt:[%d] \r\n", get_sys_battery_voltage(), bat_notify_cnt, bat_power_off_cnt);
            // }
            // printf("\r\n bat:[%d],low3v3_cnt:[%d],low3v6_cnt:[%d] \r\n", get_sys_battery_voltage(), low_3v3_cnt, low_3v6_cnt);
            break;
        }

        case ALIGN_STA:{


            // 工作阶段，电压状态只降不升 ---提示红色，低电关机
            if(sys_data.cur_mode_active_online_flag){   
                bat_notify_val = WORK_RF_STA_BAT_LOW_VAL;
                bat_power_off_val = WORK_RF_STA_BAT_POWER_OFF_VAL;
            }
            else{
                bat_notify_val = IDLE_STA_BAT_LOW_VAL;
                bat_power_off_val = IDLE_STA_BAT_POWER_OFF_VAL;
            }
        // 低于3.3v显示,进入低电保护，
            if(get_sys_battery_voltage() < bat_power_off_val){

                low_3v3_cnt ++;
                if(low_3v3_cnt > 70){
                    high_3v3_cnt = 0;
                }
                if(low_3v3_cnt > 100){
                    set_sys_err_mode(BAT_LOWEST);
                    printf("----enter lowest, bat:[%d]-----\r\n",get_sys_battery_voltage());
                    // set_sys_state(ERR_STA);
                }
            } 
            else if(get_sys_battery_voltage() < bat_notify_val){

                low_3v6_cnt ++;
                if(low_3v6_cnt > 70){
                    high_3v3_cnt = 0;
                }
                if(low_3v6_cnt > 100){
                    set_sys_err_mode(BAT_LOW);
                    // set_sys_state(ERR_STA);
                }
            }
            else{
                clear_sys_err_mode(BAT_LOWEST);
                clear_sys_err_mode(BAT_LOW);
            }  
            break;
        }
        default:{

            break;
        }
    }

}

/***********************************
 * 20ms 进入一次 
 * 
 */
void my_err_check(void)
{
    bat_too_low_ckeck();

}

